package com.spyz.hbase_api;

import com.google.common.primitives.Bytes;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;

import java.io.IOException;

public class P2_HBaseDDL_4 {
    public static Connection connection=P1_HbaseConnection_2.connection;

    /**
     * 创建命名空间
     * @param namespace 命名空间名称
     */
    public static void createNamespace(String namespace) throws IOException {

        Admin admin = connection.getAdmin();

        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);

        // 2.2 给命名空间添加需求
        builder.addConfiguration("user","spyz");

        // 2.3 使用builder构造出对应的添加完整参数的对象 完成创建
        //      创建命名空间的出现的问题    都属于本方法自身的问题 不应该抛出
        try {
            admin.createNamespace(builder.build());
        } catch (IOException e) {
            System.out.println("命名空间已经存在");
            throw new RuntimeException(e);
        }

        admin.close();

    }


    /**
     * 判断表格是否存在
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @return ture表示存在 false表示不存在
     */
    public static boolean isTableExist(String namespace,String tableName) throws IOException {

        // 1. 获取admin
        Admin admin = connection.getAdmin();

        // 2. 使用方法判断表格是否存在
        boolean b = false;
        try {
            b = admin.tableExists(TableName.valueOf(namespace, tableName));
        } catch (IOException e) {
            System.out.println("判断表格是否存在出现了异常");
            throw new RuntimeException(e);
        }

        // 3. 关闭admin
        admin.close();

        // 4. 返回结果
        return b;
    }


    /**
     * 创建表格
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @param columnFamilies    列族名称    可以有多个
     */
    public static void createTable(String namespace,String tableName,String... columnFamilies) throws IOException {

        // 判断至少有一个列族
        if (columnFamilies.length==0){
            System.out.println("至少需要有一个列族");
            return;
        }

        // 判断表格是否存在
        if (isTableExist(namespace,tableName)){
            System.out.println("表格已经存在");
            return;
        }


        // 1. 获取 admin
        Admin admin = connection.getAdmin();

        // 2. 调用方法创建表格
        // 2.1 创建表格描述建造者
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));

        // 2.2 添加参数
        for (String columnFamily : columnFamilies) {
            // 2.3 创建列族描述
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily.getBytes());

            // 2.4 对应当前的列族添加参数
            // 添加版本参数
            columnFamilyDescriptorBuilder.setMaxVersions(5);

            //2.5 创建添加完参数的列族描述
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
        }

        // 2.3 创建表格的描述
        try {
            admin.createTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            System.out.println("表格已经存在");
            throw new RuntimeException(e);
        }

        // 3. 关闭admin
        admin.close();

    }

    public static void main(String[] args) throws IOException {

       // 测试创建表格
        createTable("spyz","student","info","score");

        // 关闭连接
        P1_HbaseConnection_2.closeConnection();
    }

}
